package com.example.algorithm.Optional;

import java.util.Optional;

import static org.junit.Assert.assertEquals;

/**
 * 从 Java 8 引入的一个很有趣的特性是 Optional  类。
 * Optional 类主要解决的问题是臭名昭著的空指针异常（NullPointerException）
 *                                          —— 每个 Java 程序员都非常了解的异常。
 * @author ZMJ
 * @date 2020-04-16
 */
public class OptionalTest {
    /*
    本质上，这是一个包含有可选值的包装类，这意味着 Optional 类既可以含有对象也可以为空。
    Optional 是 Java 实现函数式编程的强劲一步，并且帮助在范式中实现。但是 Optional 的意义显然不止于此。
     */




    public static void whenEmptyValue_thenReturnDefault() {
        User user = null;
        User user2 = new User("anna@gmail.com", "1234");

        // 返回默认值
        // 第一个方法是 orElse()，它的工作方式非常直接:
        // 果有值则返回该值，否则返回传递给它的参数值：
        // 如果对象的初始值不是 null，那么默认值会被忽略：
        User result = Optional.ofNullable(user).orElse(user2);

        assertEquals(user2.getEmail(), result.getEmail());

        user = new User("john@gmail.com","1234");
        assertEquals("john@gmail.com", result.getEmail());

    }





    public static void main(String[] args) {

        // Optional 类提供了 API 用以返回对象值，或者在对象为空的时候返回默认值。
        // 第一个方法是 orElse()，它的工作方式非常直接，如果有值则返回该值，否则返回传递给它的参数值：
        whenEmptyValue_thenReturnDefault();



    }


/**
 public final class Optional<T> {
 //Null指针的封装
 private static final java.util.Optional<?> EMPTY = new java.util.Optional<>();
 //内部包含的值对象
 private final T value;
 private Optional() ;
 //返回EMPTY对象
 public static<T> java.util.Optional<T> empty() ;
 //构造函数，但是value为null，会报NPE
 private Optional(T value);
 //静态工厂方法，但是value为null，会报NPE
 public static <T> java.util.Optional<T> of(T value);
 //静态工厂方法，value可以为null
 public static <T> java.util.Optional<T> ofNullable(T value) ;
 //获取value，但是value为null，会报NoSuchElementException
 public T get() ;
 //返回value是否为null
 public boolean isPresent();
 //如果value不为null，则执行consumer式的函数，为null不做事
 public void ifPresent(Consumer<? super T> consumer) ;
 //过滤，如果value不为null，则根据条件过滤，为null不做事
 public java.util.Optional<T> filter(Predicate<? super T> predicate) ;
 //转换，在其外面封装Optional，如果value不为null，则map转换，为null不做事
 public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper);
 //转换，如果value不为null，则map转换，为null不做事
 public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) ;
 //value为null时，默认提供other值
 public T orElse(T other);
 //value为null时，默认提供other值
 public T orElseGet(Supplier<? extends T> other);
 //value为null时，默认提供other值
 public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) ;
 }
 */

}
